using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;

namespace Nb.Common.Caching
{
    //todo...
    public class PerApplicationCacheManager : IPerApplicationCacheManager
    {
        /// <summary>
        /// Gets or sets the value associated with the specified key.
        /// </summary>
        /// <typeparam name="T">Type</typeparam>
        /// <param name="key">The key of the value to get.</param>
        /// <returns>The value associated with the specified key.</returns>
        public virtual T Get<T>(string key)
        {
            object obj = HttpContext.Current.Application[key];
            if (obj == null)
            {
                return default(T);
            }
            T value = (T)obj;
            return value;
        }

        /// <summary>
        /// Adds the specified key and object to the cache.
        /// </summary>
        /// <param name="key">key</param>
        /// <param name="data">Data</param>
        public virtual void Set(string key, object data)
        {
            HttpContext.Current.Application[key] = data;
        }

        /// <summary>
        /// Gets a value indicating whether the value associated with the specified key is cached
        /// </summary>
        /// <param name="key">key</param>
        /// <returns>Result</returns>
        public virtual bool IsSet(string key)
        {
            bool isSet = HttpContext.Current.Application.AllKeys.Contains(key);
            return isSet;
        }

        /// <summary>
        /// Removes the value with the specified key from the cache
        /// </summary>
        /// <param name="key">/key</param>
        public virtual void Remove(string key)
        {
            HttpContext.Current.Application.Remove(key);
        }

        /// <summary>
        /// Removes items by pattern
        /// </summary>
        /// <param name="pattern">pattern</param>
        public virtual void RemoveByPattern(string pattern)
        {
            var keys = HttpContext.Current.Application.AllKeys.ToList();
            var regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
            var keysToRemove = keys.Where(x => regex.IsMatch(x)).ToList();
            foreach (string key in keysToRemove)
            {
                HttpContext.Current.Application.Remove(key);
            }
        }

        /// <summary>
        /// Clear all cache data
        /// </summary>
        public virtual void Clear()
        {
            HttpContext.Current.Application.Clear();
        }
    }
}